package cn.wolfcode.luowowo.listener;

import cn.wolfcode.luowowo.cache.util.RedisKeys;
import cn.wolfcode.luowowo.cache.vo.StrategyStatisVO;
import cn.wolfcode.luowowo.domain.Strategy;
import cn.wolfcode.luowowo.service.IStrategyService;
import com.alibaba.fastjson.JSON;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.util.List;

@Component
public class RedisDataInitializeListener implements ApplicationListener<ContextRefreshedEvent> {

    @Autowired
    private IStrategyService strategyService;

    @Autowired
    private StringRedisTemplate template;

    @Override
    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
        // System.out.println("--------- 初始化 begin -----------");
        // 1.需要初始化的数据
        List<Strategy> list = strategyService.list();

        // 2. 遍历给每个攻略创建 vo 对象
        for (Strategy strategy : list) {

            // 遍历得到每个攻略的 id 用于生成 vo对象的 key
            String keyName = RedisKeys.STRATEGY_COUNT_DATA_VO.getKeyName(strategy.getId());
            // 判断当前 key 是否已经存在 Redis 中 - 主要是防止每次重启都从数据库取数据,
            // 如果是第二次以后的启动,那么第一次启动之后操作的数据存在 Redis,
            // 数据还没有同步到数据库,第二次启动会导致数据覆盖的问题
            if (!template.hasKey(keyName)) {
                // 如果 key 不存在,表示之前没有启动过,或者内存得到释放,数据没了,那么重新创建 key-val,并存入 Redis
                StrategyStatisVO vo = new StrategyStatisVO();
                BeanUtils.copyProperties(strategy,vo);
                vo.setStrategyId(strategy.getId());
                template.opsForValue().set(keyName, JSON.toJSONString(vo));
            }
            // 反之,如果 key 已经存在,不做任何操作
        }
        // System.out.println("--------- 初始化 end -----------");
    }
}
